﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Sisco.AplicacionEscritorio.Util;
using Sisco.Util;

namespace Sisco.AplicacionEscritorio.Equipo
{
    public partial class AsignarEquipo : Form
    {
        private BindingList<AccesoDatos.EQUIPO> equiposPorAsignar;
        private AccesoDatos.USUARIO usuarioSistema;
        
        public AsignarEquipo()
        {
            InitializeComponent();

            equiposPorAsignar = new BindingList<AccesoDatos.EQUIPO>();
            //equiposPorAsignar.AddingNew += new AddingNewEventHandler(equiposPorAsignar_AddingNew);
        }

        public AsignarEquipo(AccesoDatos.USUARIO usuariosistema)
            : this()
        {
            usuarioSistema = usuariosistema;
        }

        private void AsignarEquipo_Load(object sender, EventArgs e)
        {
            this.CargarListaTipoEquipo();
            gridEquiposPorAsignar.DataSource = equiposPorAsignar;
        }

        private void CargarListaTipoEquipo()
        {
            LogicaNegocio.TipoEquipoBLL tipoEquipoBLL = new LogicaNegocio.TipoEquipoBLL();

            cmbTipoEquipo.DataSource = tipoEquipoBLL.Listar();
            cmbTipoEquipo.ValueMember = "ID";
            cmbTipoEquipo.DisplayMember = "NOMBRETIPO";
            cmbTipoEquipo.SelectedIndex = -1;
        }

        private void btnBuscarTipoEquipo_Click(object sender, EventArgs e)
        {
            if (cmbTipoEquipo.SelectedIndex >= 0)
            {
                LogicaNegocio.EquipoBLL equipoBLL = new LogicaNegocio.EquipoBLL();

                AccesoDatos.TIPOEQUIPO selectedTipoEquipo = cmbTipoEquipo.SelectedItem as AccesoDatos.TIPOEQUIPO;
                
                List<AccesoDatos.EQUIPO> equiposDisponibles = equipoBLL.ListarEquiposDisponibles(selectedTipoEquipo);
                
                gridEquiposDisponibles.DataSource = equiposDisponibles;
                gridEquiposDisponibles.ClearSelection();                                
            }
        }

        private void gridEquiposDisponibles_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEquiposDisponibles.DataSource != null)
            {
                gridEquiposDisponibles.Columns["ID"].Visible = false;
                gridEquiposDisponibles.Columns["IDUSUARIO"].Visible = false;
                gridEquiposDisponibles.Columns["IDEQUIPO"].Visible = false;                
                gridEquiposDisponibles.Columns["IDTIPOEQUIPO"].Visible = false;
                gridEquiposDisponibles.Columns["IDESTADO"].Visible = false;
                gridEquiposDisponibles.Columns["TIPOEQUIPO"].Visible = false;
                gridEquiposDisponibles.Columns["MARCA"].HeaderText = "Marca";
                gridEquiposDisponibles.Columns["MODELO"].HeaderText = "Modelo";
                gridEquiposDisponibles.Columns["SERIE"].HeaderText = "Serie";
                gridEquiposDisponibles.Columns["ELIMINADO"].Visible = false;
                gridEquiposDisponibles.Columns["IDUSUARIOANTIGUO"].Visible = false;
                gridEquiposDisponibles.Columns["ASIGNADO"].Visible = false;
                gridEquiposDisponibles.Columns["FECHAREGISTRO"].Visible = false;
                gridEquiposDisponibles.Columns["REGISTRADOPOR"].Visible = false;
                gridEquiposDisponibles.Columns["FECHAMODIFICACION"].Visible = false;
                gridEquiposDisponibles.Columns["MODIFICADOPOR"].Visible = false;
                gridEquiposDisponibles.Columns["NOMBEQUIPO"].Visible = false;
                gridEquiposDisponibles.Columns["EQUIPO_ESTADO"].Visible = false;
                gridEquiposDisponibles.Columns["TIPOEQUIPO1"].HeaderText = "Tipo de equipo";
                gridEquiposDisponibles.Columns["RELACION_EQUI_PROG"].Visible = false;
                gridEquiposDisponibles.Columns["USUARIO"].Visible = false;
                gridEquiposDisponibles.Columns["MOVIMIENTO"].Visible = false;
            }
        }

        private void gridEquiposAsignados_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEquiposAsignados.DataSource != null)
            {
                gridEquiposAsignados.Columns["ID"].Visible = false;
                gridEquiposAsignados.Columns["IDUSUARIO"].Visible = false;
                gridEquiposAsignados.Columns["IDEQUIPO"].Visible = false;
                gridEquiposAsignados.Columns["IDTIPOEQUIPO"].Visible = false;
                gridEquiposAsignados.Columns["IDESTADO"].Visible = false;
                gridEquiposAsignados.Columns["TIPOEQUIPO"].Visible = false;
                gridEquiposAsignados.Columns["MARCA"].HeaderText = "Marca";
                gridEquiposAsignados.Columns["MODELO"].HeaderText = "Modelo";
                gridEquiposAsignados.Columns["SERIE"].HeaderText = "Serie";
                gridEquiposAsignados.Columns["ELIMINADO"].Visible = false;
                gridEquiposAsignados.Columns["IDUSUARIOANTIGUO"].Visible = false;
                gridEquiposAsignados.Columns["ASIGNADO"].Visible = false;
                gridEquiposAsignados.Columns["FECHAREGISTRO"].Visible = false;
                gridEquiposAsignados.Columns["REGISTRADOPOR"].Visible = false;
                gridEquiposAsignados.Columns["FECHAMODIFICACION"].Visible = false;
                gridEquiposAsignados.Columns["MODIFICADOPOR"].Visible = false;
                gridEquiposAsignados.Columns["NOMBEQUIPO"].Visible = false;
                gridEquiposAsignados.Columns["EQUIPO_ESTADO"].Visible = false;
                gridEquiposAsignados.Columns["TIPOEQUIPO1"].HeaderText = "Tipo de equipo";
                gridEquiposAsignados.Columns["RELACION_EQUI_PROG"].Visible = false;
                gridEquiposAsignados.Columns["USUARIO"].Visible = false;
                gridEquiposAsignados.Columns["MOVIMIENTO"].Visible = false;
            }
        }

        private void gridEquiposPorAsignar_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridEquiposPorAsignar.DataSource != null)
            {
                gridEquiposPorAsignar.Columns["ID"].Visible = false;
                gridEquiposPorAsignar.Columns["IDUSUARIO"].Visible = false;
                gridEquiposPorAsignar.Columns["IDEQUIPO"].Visible = false;
                gridEquiposPorAsignar.Columns["IDTIPOEQUIPO"].Visible = false;
                gridEquiposPorAsignar.Columns["IDESTADO"].Visible = false;
                gridEquiposPorAsignar.Columns["TIPOEQUIPO"].Visible = false;
                gridEquiposPorAsignar.Columns["MARCA"].HeaderText = "Marca";
                gridEquiposPorAsignar.Columns["MODELO"].HeaderText = "Modelo";
                gridEquiposPorAsignar.Columns["SERIE"].HeaderText = "Serie";
                gridEquiposPorAsignar.Columns["ELIMINADO"].Visible = false;
                gridEquiposPorAsignar.Columns["IDUSUARIOANTIGUO"].Visible = false;
                gridEquiposPorAsignar.Columns["ASIGNADO"].Visible = false;
                gridEquiposPorAsignar.Columns["FECHAREGISTRO"].Visible = false;
                gridEquiposPorAsignar.Columns["REGISTRADOPOR"].Visible = false;
                gridEquiposPorAsignar.Columns["FECHAMODIFICACION"].Visible = false;
                gridEquiposPorAsignar.Columns["MODIFICADOPOR"].Visible = false;
                gridEquiposPorAsignar.Columns["NOMBEQUIPO"].Visible = false;
                gridEquiposPorAsignar.Columns["EQUIPO_ESTADO"].Visible = false;
                gridEquiposPorAsignar.Columns["TIPOEQUIPO1"].HeaderText = "Tipo de equipo";
                gridEquiposPorAsignar.Columns["RELACION_EQUI_PROG"].Visible = false;
                gridEquiposPorAsignar.Columns["USUARIO"].Visible = false;
                gridEquiposPorAsignar.Columns["MOVIMIENTO"].Visible = false;
            }
        }

        private void gridEquiposDisponibles_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (gridEquiposDisponibles.Columns[e.ColumnIndex].Name == "TIPOEQUIPO1")
            {
                AccesoDatos.TIPOEQUIPO tipoequipo = e.Value as AccesoDatos.TIPOEQUIPO;

                if (tipoequipo != null)
                {
                    e.Value = tipoequipo.NOMBRETIPO.Trim();
                }
            }
        }

        private void gridEquiposAsignados_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (gridEquiposAsignados.Columns[e.ColumnIndex].Name == "TIPOEQUIPO1")
            {
                AccesoDatos.TIPOEQUIPO tipoequipo = e.Value as AccesoDatos.TIPOEQUIPO;

                if (tipoequipo != null)
                {
                    e.Value = tipoequipo.NOMBRETIPO.Trim();
                }
            }
        }

        private void gridEquiposPorAsignar_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (gridEquiposPorAsignar.Columns[e.ColumnIndex].Name == "TIPOEQUIPO1")
            {
                AccesoDatos.TIPOEQUIPO tipoequipo = e.Value as AccesoDatos.TIPOEQUIPO;

                if (tipoequipo != null)
                {
                    e.Value = tipoequipo.NOMBRETIPO.Trim();
                }
            }
        }

        private void chkFiltro_CheckedChanged(object sender, EventArgs e)
        {
            if (chkMarcarPor.Checked)
            {
                txtMarcar.Enabled = true;
                btnMarcar.Enabled = true;
            }
            else
            {
                txtMarcar.Enabled = false;
                btnMarcar.Enabled = false;
            }
            
            txtMarcar.ResetText();
        }
                                   
        private void btnMarcar_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(txtMarcar.Text))
            {
                List<AccesoDatos.EQUIPO> lista = gridEquiposDisponibles.DataSource as List<AccesoDatos.EQUIPO>;
                int indice = lista.FindIndex(x => x.SERIE.Equals(txtMarcar.Text));

                if (indice > 0)
                {
                    gridEquiposDisponibles.Rows[indice].Selected = true;
                    gridEquiposDisponibles.CurrentCell = gridEquiposDisponibles.Rows[indice].Cells["SERIE"];
                }
            }
        }

        private void btnBuscarUsuario_Click(object sender, EventArgs e)
        {
            FormularioBuscar cuadroBuscar = new FormularioBuscar("Usuario");
            cuadroBuscar.ShowDialog(this);

            AccesoDatos.USUARIO selectedUsuario = cuadroBuscar.ObjetoBuscado as AccesoDatos.USUARIO;

            if (selectedUsuario != null)
            {
                txtUsuario.Text = selectedUsuario.NOMBRECOMPLETO;
                txtUsuario.Tag = selectedUsuario.ID;

                LogicaNegocio.EquipoBLL equipoBLL = new LogicaNegocio.EquipoBLL();

                List<AccesoDatos.EQUIPO> equiposAsignados = equipoBLL.ListarEquipo(selectedUsuario);

                gridEquiposAsignados.DataSource = equiposAsignados;
                gridEquiposAsignados.ClearSelection();
            }
        }

        private void btnAsignarEquipoUsuario_Click(object sender, EventArgs e)
        {
            if (gridEquiposDisponibles.SelectedRows.Count > 0)
            {
                AccesoDatos.EQUIPO selectedEquipo = gridEquiposDisponibles.SelectedRows[0].DataBoundItem as AccesoDatos.EQUIPO;

                if (!equiposPorAsignar.Contains(selectedEquipo))
                {
                    equiposPorAsignar.Add(selectedEquipo);

                    gridEquiposPorAsignar.DataSource = equiposPorAsignar;
                    gridEquiposPorAsignar.ClearSelection();
                }
                else
                {
                    MessageBox.Show("El equipo ya se encuentra en la lista por asignar", "Sisco", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
        }

        private void btnBorrar_Click(object sender, EventArgs e)
        {
            if(gridEquiposPorAsignar.SelectedRows.Count > 0)
            {
                int index = gridEquiposPorAsignar.SelectedRows[0].Index;

                equiposPorAsignar.RemoveAt(index);
            }
        }

        private void btnAsignar_Click(object sender, EventArgs e)
        {
            if (txtUsuario.Tag != null)
            {
                if (equiposPorAsignar.Count > 0)
                {
                    //actualizar los asignados
                    LogicaNegocio.EquipoBLL equipoBLL = new LogicaNegocio.EquipoBLL();
                    
                    int idUsuario = int.Parse(txtUsuario.Tag.ToString());
                    List<AccesoDatos.EQUIPO> updateEquipos = equiposPorAsignar.ToList<AccesoDatos.EQUIPO>();

                    int resultado = equipoBLL.AsignarEquipos(idUsuario, updateEquipos, usuarioSistema);

                    if (resultado > 0)
                    {
                        DialogResult dr = MessageBox.Show("Equipos asignados.\n¿Continúa con la asignación de equipos?", "Sisco", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                        if (dr == DialogResult.Yes)
                        {
                            this.LimpiarFormulario();
                        }
                        else if (dr == DialogResult.No)
                        {
                            this.Close();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Error al asignar los equipos seleccionados", "Sisco", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        this.LimpiarFormulario();
                    }
                }
                else
                {
                    MessageBox.Show("No hay equipos por asignar","Sisco", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Ingrese el usuario.", "Sisco", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void LimpiarFormulario()
        {
            this.CargarListaTipoEquipo();

            chkMarcarPor.Checked = false;
            gridEquiposDisponibles.DataSource = null;

            txtUsuario.ResetText();
            txtUsuario.Tag = null;

            gridEquiposAsignados.DataSource = null;
            equiposPorAsignar.Clear();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cmbTipoEquipo_SelectionChangeCommitted(object sender, EventArgs e)
        {
            chkMarcarPor.Checked = false;
            gridEquiposDisponibles.DataSource = null;
        }
    }
}
